package écrans;

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

import moteur.MoteurJeuPingPong;
/**
*  Cette classe dessine la table de ping-pong, la balle et 
*  les raquettes et affiche le score
*/
public class TableVertePingPong extends JPanel 
                           implements ConstantesDuJeu {	
  private JLabel label;
	
  private int raquetteOrdinateur_Y = 
                            RAQUETTE_ORDINATEUR_Y_DEPART;
  private int raquetteEnfant_Y = RAQUETTE_ENFANT_Y_DEPART;
  private int balle_X = BALLE_X_DEPART;
  private int balle_Y = BALLE_Y_DEPART; 
	
  Dimension taillePréférée = new 
                     Dimension(LARGEUR_TABLE, HAUTEUR_TABLE);
    
  // Cette méthode affecte sa taille au cadre.
  // Elle est appelée par Java.
  public Dimension getPreferredSize() {
    return taillePréférée;
  }
    
  // Constructeur. Crée un récepteur d'événements souris. 
  TableVertePingPong() {
 
    MoteurJeuPingPong moteurJeu = 
                                 new MoteurJeuPingPong(this);
    // Reçoit les mouvements de la souris pour déplacer la 
    // raquette.
    addMouseMotionListener(moteurJeu);
    // Reçoit les événements clavier. 
    addKeyListener(moteurJeu);
  }
	// Ajoute à un cadre la table et un JLabel 
  void ajouteAuCadre(Container conteneur) {
    conteneur.setLayout(new BoxLayout(conteneur,
                                      BoxLayout.Y_AXIS));
    conteneur.add(this);
    label = new JLabel(
      "Taper N pour une nouvelle partie, S pour servir" +
      " ou Q pour quitter");
    conteneur.add(label);
  }

  // Repeint la fenêtre. Cette méthode est appelée par Java 
  // quand il est nécessaire de rafraîchir l'écran ou quand 
  // la méthode repaint() est appelée.
  public void paintComponent(Graphics contexteGraphique) {
    	
    super.paintComponent(contexteGraphique);  
    // Dessine la table verte
    contexteGraphique.setColor(Color.GREEN);
    contexteGraphique.fillRect(
                  0, 0, LARGEUR_TABLE, HAUTEUR_TABLE); 
    	
    // Dessine la raquette droite
    contexteGraphique.setColor(Color.yellow);
    contexteGraphique.fillRect(
                  RAQUETTE_ENFANT_X,  
                  raquetteEnfant_Y,
                  LARGEUR_RAQUETTE, LONGUEUR_RAQUETTE); 

    // Dessine la raquette gauche
    contexteGraphique.setColor(Color.blue);
    contexteGraphique.fillRect(RAQUETTE_ORDINATEUR_X, 
                       raquetteOrdinateur_Y, 
                       LARGEUR_RAQUETTE, LONGUEUR_RAQUETTE); 

    // Dessine la balle
    contexteGraphique.setColor(Color.red);
    contexteGraphique.fillOval(balle_X, balle_Y, RAYON_BALLE, RAYON_BALLE);    	
    // Dessine les lignes blanches
    contexteGraphique.setColor(Color.white);
    contexteGraphique.drawRect(10, 10, LARGEUR_TABLE-20, HAUTEUR_TABLE -20);
    contexteGraphique.drawLine(LARGEUR_TABLE/2, 10, LARGEUR_TABLE/2, HAUTEUR_TABLE - 10);

    // Donne le focus à la table, afin que le récepteur de 
    // touches envoie les commandes à la table
    requestFocus();
 }
    
 // Affecte sa position courante à la raquette de l'enfant
  public void positionnerRaquetteEnfant_Y(int y) {
    this.raquetteEnfant_Y = y;
    repaint();
  }
  
  // Retourne la position courante de la raquette de l'enfant
  public int coordonnéeRaquetteEnfant_Y() {
     return raquetteEnfant_Y;
  }

  // Affecte sa position courante à la raquette de 
  // l'ordinateur
  public void positionnerRaquetteOrdinateur_Y(int y) {
    this.raquetteOrdinateur_Y = y;
    repaint();
  }
	
  // Affecte le texte du message du jeu
  public void affecterTexteMessage(String texte) {
    label.setText(texte);
    repaint();
  }
    
  // Positionne la balle
  public void positionnerBalle(int x, int y) {
    balle_X = x;
    balle_Y = y;
    repaint();
  }

  public static void main(String[] args) {
 
    // Crée une instance du cadre
    JFrame monCadre = new JFrame("Table verte de ping-pong");

    // Permet la fermeture de la fenêtre par clic sur la 
    // petite croix dans le coin.
    monCadre.setDefaultCloseOperation(
                              WindowConstants.EXIT_ON_CLOSE);
    TableVertePingPong table = new TableVertePingPong();
    table.ajouteAuCadre(monCadre.getContentPane());
    // Affecte sa taille au cadre et le rend visible.
    monCadre.setBounds(0, 0, LARGEUR_TABLE + 5, 
                                         HAUTEUR_TABLE + 40);
    monCadre.setVisible(true);
  }
}    